package main

import (
	. "azlog"
	"os"
	"path/filepath"
)

const (
	TOOL_ROOT_PATH        = "tools"
	TOOL_CFG_FILENAME     = "aztool.cfg"
	TOOL_HISTORY_FILENAME = "aztool_history.cfg"
)

type TNodeDirType int // 节点类型
const (
	NODE_TYPE_NONE TNodeDirType = iota // 无效节点
	NODE_TYPE_ROOT                     // 根目录
	NODE_TYPE_TOOL                     // 工具目录
	NODE_TYPE_NODE                     // 节点目录
)

func DirNodeCheck(path string) TNodeDirType {
	// 检查目录是否存在 aztool_history.cfg 文件
	result := NODE_TYPE_NONE

	root_path, _ := filepath.Abs(TOOL_ROOT_PATH)

	if path == root_path {
		result = NODE_TYPE_ROOT
	} else {
		entries, err := os.ReadDir(path)
		if err == nil {
			result = NODE_TYPE_NONE
			for _, entry := range entries {
				if entry.Name() == TOOL_CFG_FILENAME {
					result = NODE_TYPE_NODE
					break
				} else if entry.IsDir() {
					result = NODE_TYPE_TOOL
				}
			}
		}
	}

	return result
}

type TToolNodeObj struct {
	dir_path string          // 文件夹名
	is_tool  TNodeDirType    // 是否是工具目录. 存在 TOOL_CFG_FILENAME 则为工具目录; 否则作为节点集
	children []*TToolNodeObj // 子目录
}

func (this *TToolNodeObj) NodeName() string {
	return filepath.Base(this.dir_path)
}

func (this *TToolNodeObj) ScanDir() error {
	entries, err := os.ReadDir(this.dir_path)
	if err != nil {
		LOG_E("Failed to read directory %s: %v", this.dir_path, err)
		return err
	}

	var node_type TNodeDirType

	for _, entry := range entries {
		abs_path := filepath.Join(this.dir_path, entry.Name())

		node_type = DirNodeCheck(abs_path)
		if node_type != NODE_TYPE_NONE {
			child := &TToolNodeObj{
				dir_path: abs_path,
				is_tool:  node_type,
			}
			this.children = append(this.children, child)

			if node_type == NODE_TYPE_NODE {
				// 如果是节点目录，则递归扫描
				child.children = []*TToolNodeObj{}
				child.ScanDir()
			}
		}
	}
	return nil
}

var g_tool_root_node *TToolNodeObj

func init() {
	LOG_I("ToolMgr initialized")

	absPath, _ := filepath.Abs(TOOL_ROOT_PATH)

	g_tool_root_node = &TToolNodeObj{
		dir_path: absPath,
		is_tool:  NODE_TYPE_ROOT,
		children: []*TToolNodeObj{},
	}

	// 递归扫描工具目录
	g_tool_root_node.ScanDir()

	LOG_D("测试功能提前退出")
	os.Exit(1)
}
